From: Joey Hess Date: Tue, 16 Sep 2025 01:33:10 +0000 (-0400) Subject: set locale encoding after fdTohandle X-Git-Tag: archive/raspbian/10.20251029-1+rpi1~1^2~3^2~103 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=06a813ad4483a40b98199a0e4adfa2f4b11d6dcf;p=git-annex.git set locale encoding after fdTohandle fdToHandle does not set the usual system locale encoding, so when the Handle is used for any String IO, it needs to be done manually for correctness. I don't know if this fixes any bugs. It might eg, fix a bug with multicast receive of a file. Sponsored-by: Leon Schuermann --- diff --git a/Annex/Multicast.hs b/Annex/Multicast.hs index a559c76c23..4fe3e0af6c 100644 --- a/Annex/Multicast.hs +++ b/Annex/Multicast.hs @@ -18,6 +18,7 @@ import System.Posix.IO #else import System.Process (createPipeFd) #endif +import GHC.IO.Encoding (getLocaleEncoding) multicastReceiveEnv :: String multicastReceiveEnv = "GIT_ANNEX_MULTICAST_RECEIVE" @@ -34,6 +35,7 @@ multicastCallbackEnv = do (rfd, wfd) <- createPipeFd #endif rh <- fdToHandle rfd + getLocaleEncoding >>= hSetEncoding rh environ <- addEntry multicastReceiveEnv (show wfd) <$> getEnvironment return (gitannex, environ, rh) @@ -46,6 +48,7 @@ runMulticastReceive :: [String] -> String -> IO () runMulticastReceive ("-I":_sessionid:fs) hs = case readish hs of Just fd -> do h <- fdToHandle fd + getLocaleEncoding >>= hSetEncoding h mapM_ (hPutStrLn h) fs hClose h Nothing -> return () diff --git a/Assistant.hs b/Assistant.hs index 3ad8926960..911ebd33d3 100644 --- a/Assistant.hs +++ b/Assistant.hs @@ -56,6 +56,8 @@ import Annex.Path #ifdef mingw32_HOST_OS import Utility.Env import System.Environment (getArgs) +#else +import GHC.IO.Encoding (getLocaleEncoding) #endif import qualified Utility.Debug as Debug @@ -82,10 +84,15 @@ startDaemon assistant foreground startdelay cannotrun listenhost listenport star let logfd = handleToFd =<< openLog (fromOsPath logfile) if foreground then do - origout <- liftIO $ catchMaybeIO $ - fdToHandle =<< dup stdOutput - origerr <- liftIO $ catchMaybeIO $ - fdToHandle =<< dup stdError + enc <- liftIO getLocaleEncoding + origout <- liftIO $ catchMaybeIO $ do + h <- fdToHandle =<< dup stdOutput + hSetEncoding h enc + return h + origerr <- liftIO $ catchMaybeIO $ do + h <- fdToHandle =<< dup stdError + hSetEncoding h enc + return h let undaemonize = Utility.Daemon.foreground logfd (Just pidfile) start undaemonize $ case startbrowser of diff --git a/Utility/LockFile/PidLock.hs b/Utility/LockFile/PidLock.hs index 67cf78d62e..6cd556b34c 100644 --- a/Utility/LockFile/PidLock.hs +++ b/Utility/LockFile/PidLock.hs @@ -49,6 +49,7 @@ import System.Posix.Types import System.Posix.IO.ByteString import System.Posix.Files.ByteString import System.Posix.Process +import GHC.IO.Encoding (getLocaleEncoding) import Control.Monad import Control.Monad.IO.Class (liftIO, MonadIO) import Data.Maybe @@ -213,7 +214,9 @@ linkToLock (Just _) src dest = do (Just $ combineModes readModes) (defaultFileFlags { exclusive = True }) (CloseOnExecFlag True) - fdToHandle fd + h <- fdToHandle fd + getLocaleEncoding >>= hSetEncoding h + return h let cleanup = hClose let go h = F.readFileString src >>= hPutStr h bracket setup cleanup go diff --git a/Utility/Process/Transcript.hs b/Utility/Process/Transcript.hs index cb71e30b91..0dd4153372 100644 --- a/Utility/Process/Transcript.hs +++ b/Utility/Process/Transcript.hs @@ -23,6 +23,7 @@ import Control.Monad #ifndef mingw32_HOST_OS import Control.Exception import qualified System.Posix.IO +import GHC.IO.Encoding (getLocaleEncoding) #else import Control.Applicative #endif @@ -51,6 +52,9 @@ processTranscript'' cp input = do System.Posix.IO.setFdOption writef System.Posix.IO.CloseOnExec True readh <- System.Posix.IO.fdToHandle readf writeh <- System.Posix.IO.fdToHandle writef + enc <- getLocaleEncoding + hSetEncoding readh enc + hSetEncoding writeh enc return (readh, writeh) let cleanup (readh, writeh) = do hClose readh